package com.example.utils;

import com.example.constants.Constants;
import com.example.pojo.auth.*;

import java.io.*;
import java.util.*;

public class Authentication {
    // 获取华为云物联网平台的token令牌
    public static String getToken() throws IOException {
        // 构建认证信息对象
        AccessTokenDTO accessTokenDTO = new AccessTokenDTO();
        AuthDTO authDTO = new AuthDTO();
        DomainDTO domainDTO = new DomainDTO();
        IdentityDTO identityDTO = new IdentityDTO();
        PasswordDTO passwordDTO = new PasswordDTO();
        UserDTO userDTO = new UserDTO();
        ProjectDTO projectDTO = new ProjectDTO();
        ScopeDTO scopeDTO = new ScopeDTO();
        // 填写认证信息
        projectDTO.setName(Constants.PROJECT_NAME);   // 指定华为云区域（华北-北京四）
        scopeDTO.setProject(projectDTO);
        domainDTO.setName(Constants.DOMAIN_USERNAME);   // 主账户名
        userDTO.setName(Constants.USERNAME);    // IAM用户名
        userDTO.setPassword(Constants.PASSWORD); // IAM用户密码
        userDTO.setDomain(domainDTO);
        passwordDTO.setUser(userDTO);

        identityDTO.setPassword(passwordDTO);
        identityDTO.setMethods(Collections.singletonList("password"));
        authDTO.setIdentity(identityDTO);
        authDTO.setScope(scopeDTO);
        accessTokenDTO.setAuth(authDTO);

        HttpUtils httpUtils = new HttpUtils();

        Map<String, String> header = new HashMap<>();
        header.put("Content-Type", "application/json"); // 声明JSON格式请求体

        // 发送请求
        HttpUtils.ResponseWithHeaders response = httpUtils.doPostWithHeaders(
                Constants.TOKEN_ACCESS_URL,
                header,
                JsonUtils.Obj2String(accessTokenDTO)    // 对象转JSON字符串
        );

        if (response == null || response.headers == null) {
            System.err.println("网络请求失败或未获取到响应头");
            return null;
        }

        // 从响应头中获取 X-Subject-Token
        String token = response.headers.get("X-Subject-Token");
        if (token == null) {
            System.err.println("未获取到 X-Subject-Token");
            return null;
        }

        return token;
    }
}
